<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=iso-8859-1">
  <TITLE>prog2aufg7</TITLE>
  <LINK rel=stylesheet type="text/css" media="screen" href="screen.css">
  <LINK rel=stylesheet type="text/css" media="print" href="print.css">
</HEAD>
<BODY>
<P><FONT SIZE="3">Hochschule Augsburg &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 04. 05. 2011<BR>
Fakult&auml;t f&uuml;r  Informatik<BR>
Prof. Meixner</FONT>
<H3> <FONT SIZE="3"><B>Praktikum Programmieren 2 im Studiengang Informatik</B></FONT> </H3>
<h3> <FONT SIZE="3"><B>Aufgabe 7</B></FONT> </h3>
<h4>1. Teil: Collection-Framework</h4>
<P>Ersetzen Sie <B>alle</B> (auch die m&uuml;hselig selbst geschriebenen) Container
in Ihrer Bank (z. B. &nbsp;f&uuml;r Konten, Konditionen, Buchungen) durch
geeignete Klassen aus dem Collection-API. Nutzen Sie dessen
Framework-Eigenschaften (Interfaces) um ein m&ouml;glichst einfaches Austauschen
der Collection-Implementierungen zu erm&ouml;glichen.
<P> Verwenden Sie insbesondere f&uuml;r die Konto-Verwaltung eine Hashtabelle
  (mit Schl&uuml;ssel Kontonummer), so da&szlig; die Kontonummern prinzipiell
  per Zufallsgenerator erzeugt werden k&ouml;nnen (Letzteres ist eine freiwillige Zusatzaufgabe).<br>
  Falls Sie Konten bzgl. unterschiedlicher W&auml;hrungen in einer Bank unterst&uuml;tzen: Wie k&ouml;nnten Sie die Konten zu einer W&auml;hrung sinnvoll gruppieren?
<h4>2. Teil: Sortieren</h4>
<P>Der Kontoauszug (noch immer ein String) soll ab jetzt sowohl sortiert nach
    der zeitlichen Reihenfolge der Buchungen als auch nach der H&ouml;he der
    Betr&auml;ge und dem Buchungsgrund geliefert werden k&ouml;nnen. Welche
    Sortierung bei einer Kontoauszugserstellung konkret verwendet wird, soll
    durch einen geeigneten Parameter der zugeh&ouml;rigen Bank-Methode festgelegt
    werden.<BR>
Verwenden Sie die Sort-Methode der Klasse <CODE>Collections </CODE>und realisieren Sie f&uuml;r die verschiedenen Sortierkriterien geeignete <CODE>Comparator</CODE>-Implementierungen.
<br>
&Uuml;berlegen Sie sich eine geeignete Zuordnung zwischen der Vorgabe des Sortierkriteriums per Methoden-Parameter und dem zugeh&ouml;rigen Comparator (Stichwort <code>Map</code>).
<h4>3. Teil: Mehrere Banken</h4>
<P>Nun wollen wir als Beispiel f&uuml;r B2B (hier: <B>B</B>ank to <B>B</B>ank)
    auch &Uuml;berweisungen zwischen Konten bei verschiedenen Banken realisieren.
    Dazu muss es eine &Uuml;berladung der schon fr&uuml;her definierten &Uuml;berweisungsmethode geben,
    die als weiteren Parameter die empfangende Bank (ein Name als <CODE>String</CODE>) besitzt.
<P> Entsprechend unserer gewohnt systematischen Herangehensweise &uuml;berlegen
      wir uns zun&auml;chst, welche Kommunikation (in Form von Methodenaufrufen)
      zu diesem Zweck zwischen zwei Banken erforderlich ist und legen die ermittelte(n)
      Methode(n) in einem eigenen Interface namens <CODE>B2B</CODE> ab, welches
      nat&uuml;rlich von allen Banken implementiert werden muss, die an B2B teilnehmen
      wollen.
<P> Aber zuallererst brauchen wir mehrere Banken. Diese sollen zun&auml;chst
      alle in einer virtuellen Maschine laufen, d. h. in Ihrer <CODE>main()</CODE>-Methode instanziert werden. Damit aber die Bank bei Vorliegen
      ihres Namens wiedergefunden werden kann (siehe obige &Uuml;berweisungsmethode),
      m&uuml;ssen die Bank-Objekte an einem "zentralen Ort" registriert werden.
<P> Definieren Sie also eine Klasse <CODE>BankRegistry</CODE>, die in einer <CODE>Map</CODE> die Bank-Instanzen unter dem Key Name (Typ <CODE>String</CODE>) verwaltet. Die Klasse besitzt die zwei Methoden <CODE>void
      bind(String name, B2B bank)</CODE> und <CODE>B2B lookup(String name)</CODE> zum
      Ablegen bzw. "Nachschlagen" einer Bank-Instanz. Die Registry soll
      gem&auml;&szlig; dem Singleton-Pattern verwaltet werden.
<P> Nun sollte es keine gr&ouml;&szlig;eren Hindernisse mehr geben,
      &Uuml;berweisungen auch &uuml;ber Bankgrenzen hinweg zu realisieren. Im
      einfachsten Fall f&uuml;hrt dies zu einer Abbuchung bei dem Absender-Konto
      und zu einer Zuzahlung auf dem Empf&auml;nger-Konto. Behandeln Sie dabei
      auch den Fall, dass das "losgeschickte" Geld bei der empfangenden Bank nicht
      gutgeschrieben werden kann, weil z. B. das Empf&auml;ngerkonto gar nicht
      existiert (Stichwort: Korrekturbuchung!).
<P> Fertigen Sie f&uuml;r den Gesamtablauf der hinter dieser
      &Uuml;berweisungsmethode steckt, ein kleines Sequenz-Diagramm an, um einen &Uuml;berblick hinsichtlich beteiligter Klassen und Verantwortlichkeiten zu erhalten!
<P> Wer Lust hat, kann sich auch um eine Saldo-Verwaltung zwischen den Banken
      k&uuml;mmern, so dass ermittelt werden kann, wieviele Geldscheine "am Abend"
      auch physikalisch zwischen den Banken transferiert werden m&uuml;ssen.
<P>Erstellen Sie einen Unit-Test f&uuml;r die <code>BankRegistry</code>-Klasse und einen Integrationstest f&uuml;r die Bank-zu-Bank-&Uuml;berweisung auf Basis von JUnit.
<P>

<P>
<P><B>Abnahme: i. d. R. am 12.5. bzw. 16. 5.., sp&auml;testens am 19.5. bzw. 23. 5.!</B>
</BODY></HTML>
